    /*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package wf3.gps;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import acceso.util.GpsUtil;
import java.io.Serializable;

/**
 *
 * @author john
 */
public class Escenario implements Serializable{

    private Filtro filtro_selec;
    private List<Filtro> l_filtros_disponibles;
    private Escenario escenario_ant;
    private Escenario escenario_sig;
    private List<PunConfig> l_puntos_mostrados;
    
    private String ti_sortca = "asc";
    private String ti_sortno = "asc";
    
    public Escenario(List<Filtro> l_filtros_disponibles, Escenario escenario_ant){
        this.escenario_ant = escenario_ant;
        this.l_filtros_disponibles = l_filtros_disponibles;
        
        this.filtro_selec = this.l_filtros_disponibles.get(0);
        this.l_puntos_mostrados = new ArrayList<>();
        seleccionarAllAgrupamientos();
    }

    
    public Escenario(List<Filtro> l_filtros_disponibles){
        this.l_filtros_disponibles = new ArrayList<>(l_filtros_disponibles);
        
        this.filtro_selec = this.l_filtros_disponibles.get(0);
        this.l_puntos_mostrados = new ArrayList<>();
        seleccionarAllAgrupamientos();
    }

    public Filtro getFiltro_selec() {
        return filtro_selec;
    }

    public void setFiltro_selec(Filtro filtro_selec) {
        this.filtro_selec = filtro_selec;
    }

    public List<Filtro> getL_filtros_disponibles() {
        return l_filtros_disponibles;
    }

    public void setL_filtros_disponibles(List<Filtro> l_filtros_disponibles) {
        this.l_filtros_disponibles = l_filtros_disponibles;
    }
    
    public Escenario getEscenario_ant() {
        return escenario_ant;
    }

    public void setEscenario_ant(Escenario escenario_ant) {
        this.escenario_ant = escenario_ant;
    }

    public Escenario getEscenario_sig() {
        return escenario_sig;
    }

    public void setEscenario_sig(Escenario escenario_sig) {
        this.escenario_sig = escenario_sig;
    }

    public List<PunConfig> getL_puntos_mostrados() {
        return l_puntos_mostrados;
    }

    public void setL_puntos_mostrados(List<PunConfig> l_puntos_mostrados) {
        this.l_puntos_mostrados = l_puntos_mostrados;
    }

    public String getTi_sortca() {
        return ti_sortca;
    }

    public void setTi_sortca(String ti_sortca) {
        this.ti_sortca = ti_sortca;
    }

    public String getTi_sortno() {
        return ti_sortno;
    }

    public void setTi_sortno(String ti_sortno) {
        this.ti_sortno = ti_sortno;
    }
    
    public void ordenarAgrupamientos(String tipo, String modo){
        if(tipo.equals("nombre")){
            if(modo.equals("asc")){
                Collections.sort(filtro_selec.getL_agrupa(), new Comparator<Agrupamiento>() {
                    @Override
                    public int compare(Agrupamiento a1, Agrupamiento a2) {
                        return a1.getNo_agrupa().compareTo(a2.getNo_agrupa());
                    }
                });
            }else if(modo.equals("desc")){
                Collections.sort(filtro_selec.getL_agrupa(), new Comparator<Agrupamiento>() {
                    @Override
                    public int compare(Agrupamiento a1, Agrupamiento a2) {
                        return a1.getNo_agrupa().compareTo(a2.getNo_agrupa());
                    }
                });
                Collections.reverse(filtro_selec.getL_agrupa());
            }
            ti_sortno = modo;
            
        }else if(tipo.equals("cantidad")){
            if(modo.equals("asc")){
                Collections.sort(filtro_selec.getL_agrupa(), new Comparator<Agrupamiento>() {
                    @Override
                    public int compare(Agrupamiento a1, Agrupamiento a2) {
                        int value = 0;
                        if (a1.getL_config().size() > a2.getL_config().size())
                                value = 1;
                        else if (a1.getL_config().size() < a2.getL_config().size())
                                value = -1;
                        else if (a1.getL_config().size() == a2.getL_config().size())
                                value = 0;
                        return value;
                    }
                });
            }else if(modo.equals("desc")){
                Collections.sort(filtro_selec.getL_agrupa(), new Comparator<Agrupamiento>() {
                    @Override
                    public int compare(Agrupamiento a1, Agrupamiento a2) {
                        int value = 0;
                        if (a1.getL_config().size() > a2.getL_config().size())
                                value = 1;
                        else if (a1.getL_config().size() < a2.getL_config().size())
                                value = -1;
                        else if (a1.getL_config().size() == a2.getL_config().size())
                                value = 0;
                        return value;
                    }
                });
                Collections.reverse(filtro_selec.getL_agrupa());
            }
            ti_sortca = modo;
        }
    }
    
    private void seleccionarAllAgrupamientos(){
        for(Agrupamiento a : this.filtro_selec.getL_agrupa()){
            seleccionar_agrupamiento(a.getNu_geocapval());
        }
    }
    
    private void quitarPuntos(List<Filtro> filtros){
        Iterator<Filtro> it = filtros.iterator();
        while(it.hasNext()){
            Filtro f = it.next();
            if(f.getNu_geocap() == filtro_selec.getNu_geocap()){
                it.remove();
            }else{
                for(Agrupamiento a : f.getL_agrupa()){
                    Iterator<PunConfig> iterator = a.getL_config().iterator();
                    while(iterator.hasNext()){
                        PunConfig pc = iterator.next();
                        boolean existe = false;
                        for(PunConfig p : l_puntos_mostrados){
                            if(p.getId_pungeo() == pc.getId_pungeo()){
                                existe = true;
                                break;
                            }
                        }
                        if(!existe){
                            iterator.remove();
                        }
                    }
                }
            }
        }
    }
    
    public void filtrar(){
        List<Filtro> l = GpsUtil.clonarFiltros(l_filtros_disponibles);
        quitarPuntos(l);
        escenario_sig = new Escenario(l, this);
    }
    
    public synchronized void seleccionar_agrupamiento(int nu_geocapval){
        for(Agrupamiento a : filtro_selec.getL_agrupa()){
            if(a.getNu_geocapval() == nu_geocapval){
                a.setIl_select(true);
                //agregar a la lista de puntos mostrados si no existe
                for(PunConfig p : a.getL_config()){
                    boolean existe = false;
                    for(PunConfig p2 : l_puntos_mostrados){
                        if(p.getId_pungeo() == p2.getId_pungeo()){
                            existe = true;
                            break;
                        }
                    }
                    if(!existe){
                        l_puntos_mostrados.add(p);
                    }
                }
                if(escenario_sig != null){
                    List<Filtro> l = GpsUtil.clonarFiltros(l_filtros_disponibles);
                    quitarPuntos(l);
                    escenario_sig.recargar(l);
                }
                break;
            }
        }
    }
    
    public synchronized void deseleccionar_agrupamiento(int nu_geocapval){
        for(Agrupamiento a : filtro_selec.getL_agrupa()){
            if(a.getNu_geocapval() == nu_geocapval){
                a.setIl_select(false);
                //eliminar de la lista de puntos mostrados si existe
                for(PunConfig p : a.getL_config()){
                    boolean existe = false;
                    for(PunConfig p2 : l_puntos_mostrados){
                        if(p.getId_pungeo() == p2.getId_pungeo()){
                            existe = true;
                            break;
                        }
                    }
                    if(existe){
                        l_puntos_mostrados.remove(p);
                    }
                }
                if(escenario_sig != null){
                    List<Filtro> l = GpsUtil.clonarFiltros(l_filtros_disponibles);
                    quitarPuntos(l);
                    escenario_sig.recargar(l);
                }
                break;
            }
        }
    }
    
    public void cambiar_filtro(int nu_geocap){
        for(Agrupamiento a : filtro_selec.getL_agrupa()){
            if(a.isIl_select()){
                deseleccionar_agrupamiento(a.getNu_geocapval());
            }
        }
        for(Filtro f : l_filtros_disponibles){
            if(f.getNu_geocap() == nu_geocap){
                this.filtro_selec = f;
            }
        }
        seleccionarAllAgrupamientos();
    }
    
    public void recargar(List<Filtro> l_filtros){
        this.l_filtros_disponibles = l_filtros;
        this.l_puntos_mostrados = new ArrayList<>();
        
        //almacenar los nu_geocapval selecionados
        List<Integer> l_nu_geocapval = new ArrayList();
        for(Agrupamiento a : filtro_selec.getL_agrupa()){
            if(a.isIl_select()){
                l_nu_geocapval.add(a.getNu_geocapval());
            }
        }
        
        //seleccionar filtro seleccionado
        for(Filtro f : this.l_filtros_disponibles){
            if(f.getNu_geocap() == filtro_selec.getNu_geocap()){        
                this.filtro_selec = f;
            }
        }
        
        //seleccionar las agrupaciones seleccinadas
        for(int nu_geocapval : l_nu_geocapval){
            seleccionar_agrupamiento(nu_geocapval); 
        }
        
    }
}
